iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
Security

從自建漏洞中學習 - 一起填坑吧系列 第 22

Auth 應用程式 - Error 處理篇之 2

  • 分享至 

  • xImage
  •  

Auth 應用程式 - Error 處理篇之 2

在上次介紹了一些我們在處理 Error 需要的重要 function,接著我會在下個篇章介紹在處理 Error 時的先備知識以及需要考量的問題。

在介紹這些問題之前,今天我們會先稍微複習一下 HTTP StatusCode 以及處理相關 Error 需要注意的問題:

StatusCode

https://ithelp.ithome.com.tw/upload/images/20231007/201071975v9LehDcWr.png

HTTP StatusCode (HTTP 狀態碼) 表明一個 HTTP 要求是否已經被完成的狀態回應分為五種:

  • 資訊回應 (Information responses)

    範圍: 100 ~ 199

    舉一些 1xx status code 的例子:

    • 100 : 繼續
    • 101 : 切換通訊協定
  • 成功回應 (Successful responses)

    範圍: 200 ~ 299

    舉一些 2xx status code 的例子:

    • 200 : 請求成功
  • 重定向 (Redirects)

    範圍: 300 ~ 399

    舉一些 3xx status code 的例子:

    • 301 : 請求該資源已經永久改變 URI。有時會在 response 內回應新的 URI,也就是未來用戶在連結此網址時應該導向的地方
    • 302 : 表示所請求資源的 URI 已暫時變更。將來可能會對 URI 進行新的更改,而客戶端應在將來的請求中使用相同的 URI
    • 304 : 請求該資源時,其內容並沒有變更,告知資源未修改 ( 表示 Client 端只需要使用 local cache 中的副本資源即可 )
    • 305 : 請求的資源必須透過 Server 指定的 proxy 才能查看 ( ex. 透過 Location HTTP header )
  • 用戶端錯誤 ( Client Errors )

    範圍: 400 ~ 499

    舉一些 4xx status code 的例子:

    • 400 : 錯誤的要求 ( Server 因為收到錯誤的語法,而無法理解請求。)
    • 401 : 拒絕存取,需要授權才回應的請求
    • 403 : 禁止使用 - 伺服端知道用戶端的身份,而用戶端並無訪問權限
    • 404 : 伺服器找不到請求的資源
  • 伺服器端錯誤 ( Server Errors )

    範圍: 500 ~ 599

    舉一些 5xx status code 的例子:

    • 500 : 伺服器端發生未知或無法處理的錯誤

    • 502 : 無效的閘道 - 作為閘道的 Server 在獲取處理請求所需的回應時,得到無效回應

    • 503 : 無效的服務 - 伺服器尚未準備好處理請求。(ex. 伺服器因維護而停機或過載。)

    • 504 : 閘道逾時 - 作為閘道的 Server 無法及時得到回應

使用 StatusCode 需要注意的問題

  • 我們真的有需要拋出這個 Error 對應這個 StatusCode 嗎 ?

    • 這句話是什麼意思呢?

      在 Error 處裡的時候,我們通常會去定義一個錯誤以及他對應的 StatusCode。

      舉個例子,在 getPost 中, Client 在 嘗試取得一個不存在的 post ID 對應的 post,那麼這時候我們會處理這個情形並拋出 404 的 StatusCode ,如以下範例:

      export.getPost = catchAsyncError(async (req, res, next) => {
      
          const post = await Post.findById(req.params.id);
      
          if(!post) {
              next(new AppError('No post found with that ID', 404));
          }
      
      });
      
    • 但我們真的需要在所有地方都處理 404 嗎?

      假設我們今天想要取得所有的 post,在 getAllPosts 中,我們或許就不需要在沒有取得 post 的情況下,還拋出例外回傳 404。

      因為 getAllPost 還是可以存在空值,若沒有資料就表示 DB 中沒有任何的 post,他確實也完成了搜尋的工作,所以回傳空也可以,故我們只需要回傳 200,其他錯誤交給 catchAsyncError~

      請看以下範例:

      export.getAllPosts = catchAsyncError(async (req, res, next) => {
      
          // 以上省略獲取資料的程式碼,假設我們拿到 posts
          const posts = await features.query;
      
          // 注意! 我們不會特別加入以下程式碼處理空值
          // 
          // if(!posts) {
          //     next(new AppError('No post found with that ID', 404));
          // }
      
          // 返回 response
          res.status(200).json({
              status: 'success',
              results: posts.length,
              data: {
                  posts
              }
          });
      
      });
      

今日小心得

今天稍微複習了一下 StatusCode,順便看了一下有關哪些情況要怎麼使用 status code 的範例介紹,覺得滿有趣的 ~


Reference


上一篇
Auth 應用程式 - Error 處理篇
下一篇
Auth 應用程式 - Error 處理篇之 3
系列文
從自建漏洞中學習 - 一起填坑吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言